package jech913;

import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

//SungJukV2Server는 다른 컴퓨터에 저장 해 놓는다고 치고~
public class SungJukV2Server {
	public static void main(String[] args){
		SungJukV2Server app = new SungJukV2Server();
		//성적처리 서버 호출 
		app.service();
	}

	private void service() {
		//소켓: 통신을 위해 소프트웨어로 작성된 접속 점
		//		일반적으로 ip와 port로 구성 됨. 
		ServerSocket server = null;
		Socket connection = null;
		
		try{
			//ServerSocket(포트번호)
			server = new ServerSocket(9130);
			System.out.println("[서버] 성적서버가 시작됩니다...");
			
			while(true){
				System.out.println("[서버] 클라이언트 접속을 기다립니다...");
				//클라이언트의 접속을 기다림.
				connection = server.accept();
				
				//접속 후 메세지 띄우고 processSungJuk 메소드를 실행 
				System.out.println("[서버]" + connection.getInetAddress() + "에서 접속하였습니다...");
				
				//클라이언트 보내는 데이터를 처리하기 위해 성적처리 메소드 호출
				processSungJuk(connection);
				System.out.println("[서버] 클라이언트의 접속을 해제합니다...");
			}
		
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

	private void processSungJuk(Socket connection) {
		InputStream is = null;
		OutputStream os = null;
		ObjectInputStream ois = null;
		ObjectOutputStream oos = null;
		
		
		try{
			//소켓에서 클라이언트를 출발지로 하는 일반적인 소켓 입력스트림
			is = connection.getInputStream();
			
			//객체를 스트림으로 받기 위해 소켓 스트림을 객체 입력스트림으로 변경 
			ois = new ObjectInputStream(is);
			
			//클라이언트에서 스트림으로 보낸 객체를 읽어서 
			SungJukV2VO sj = (SungJukV2VO)ois.readObject();
			
			//비지니스 로직 처리
			sj.setTot(sj.getKor()+sj.getEng()+sj.getMath());
			sj.setAvg((float)sj.getTot()/3);
			switch((int)sj.getAvg()/10){
			case 10:
			case 9:
				sj.setGrd('수');
				break;
			case 8:
				sj.setGrd('우');
				break;
			case 7:
				sj.setGrd('미');
				break;
			case 6:
				sj.setGrd('양');
				break;
			default:
				sj.setGrd('가');
				break;
	
			}
			
			//소켓에서 클라이언트를 목적지로 하는 일반적인 출력 스트림을 가져옴. 
			os = connection.getOutputStream();
			//스트림에 객체를 보내기 위해 소켓 출력스트림을 객체 출력스트림으로 변경 
			oos = new ObjectOutputStream(os);
			//스트림에 객체를 클라이언트로 흘려보냄. 
			oos.writeObject(sj);
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}
	
	
}
